package com.cctc.juc.source.Bitc.Cfinal;
/**
 * 【final 关键字】
 * 简述：final 是 Java 虚拟机提供的一个关键字，主要用于修饰类、成员变量和方法。
 * 1. 对于使用 final 关键字修饰的类被称为 “不可变” 类，不可以被继承，使用 “不可变” 类构造的对象被称为 “不可变” 对象，要求对象所有的属性都是不可变的，一旦 “不可变” 对象的属性发生了改变，那就不是原来的对象了，典型的 “不可变” 类和 “不可变” 对象就是我们常用的 String 字符串类及使用 “String” 类构造的对象。
 * - “不可变” 对象可以在没有任何同步机制的情况下进行共享，以降低对该对象进行并发访问时的同步化开销。
 * 2. 对于使用 final 关键字修饰的变量为 “常量”，“常量” 一旦被初始化（直接初始化，或通过构造器进行初始化）赋值之后是不可以被改变的。对于 “引用” 类型的 “常量” 来说，只是表示 “引用” 不可变，但 “引用” 所指向的对象内容是可以被改变的。
 * --> 对于使用 final 关键字修饰的 “引用” 变量，JVM 对其指令重排序进行了一定的约束，即需要遵循以下两条 Happens-Before（先行发生）规则：
 * 1）对一个 final “引用” 对象的初始化操作必须先行发生于对该 “引用” 的赋值操作，以避免线程访问到尚未初始化的 “引用” 对象而产生错误；
 * 2）对一个 final “引用” 的初次读取操作必须先行发生于对它所 “引用” 的对象内容的初次访问操作，以避免线程访问到不正确的 “引用” 对象而产生错误。
 * 从而确保并发环境下 final “引用” 变量的内存可见性和指令有序性。
 * 3. 对于使用 final 关键字修饰的方法称为 “最终方法”，不可以被任何子类重写覆盖。正是由于这个特性，即无论在任何上下文中调用 “最终方法”，其行为都是一致的。这使得编译器在编译期间就可以确定此类方法的确切行为，就可以安全地将此类方法的代码 “内联（复制）” 到每一个调用点处，而不是执行传统的函数调用，虽然会增加代码的体积，但却减少了函数调用（例如节省先压栈、再跳转、后返回等指令）的开销，“以空间换时间”，从而提升程序运行的效率。
 * --> “内联（Inline）” 是编译器为了提升程序运行效率的一种优化方法，主要用于减少函数调用（例如节省先压栈、再跳转、后返回等指令）的开销。
 * 例如对于使用 final 关键字修饰的方法（其在任何上下文中调用的行为都是一致的），以及一些被频繁调用且体积较小的方法，编译器会选择将其方法 “内联（复制）” 到每一个函数调用点处，而不是执行传统的函数调用，虽然会增加代码的体积，但却减少了函数调用（例如节省先压栈、再跳转、后返回等指令）的开销，“以空间换时间”，从而提升程序运行的效率。
 * “内联（Inline）” 的实现过程：
 * 1）识别 “热点” 方法；
 * 2）检查 “内联” 可行性；
 * 3）“复制” 代码；
 * 4）“优化” 代码，重新编译。
 */